const HOST = 'localhost'
const PORT = '6163'
const POINT_STYLE = {
  Angle: 0, // 角度
  Color: 541, // 子图的颜色号
  Space: 0,
  SymHeight: 5, // 点的高度
  SymID: 31, // 子图号
  SymWidth: 5, // 点的宽度
}
/**
 * 添加点要素
 * @param {array} point: 点的坐标[x坐标, y坐标]
 * @param {array} attr: 属性数组[{name: 'name', value: '武汉', type: 'string'}, {}]
 * @param {object} info: 服务的信息 {doc: '地图文档对象', name: '服务名称', layerID: '图层编号'}
 * @param {function} callback: 回调函数
 */
function addPoint(point, attr, info, callback) {
  if (!Array.isArray(point)) {
    throw new TypeError('第一个参数必须是一个数组, 长度为2')
  }

  if (!Array.isArray(attr)) {
    throw new TypeError('第二个参数必须是一个数组')
  }
  // 2.1 构建几何信息
  //创建一个点形状，描述点形状的几何信息
  var gpoint = new Zondy.Object.GPoint(point[0], point[1]) //createPoint();
  //设置当前点要素的几何信息
  var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] })
  // 2.2 设置样式信息
  //描述点要素的符号参数信息
  var pointInfo = new Zondy.Object.CPointInfo(POINT_STYLE)
  //设置当前点要素的图形参数信息
  var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
    InfoType: 1, // 点
    PntInfo: pointInfo,
  })
  // 2.3 设置属性信息
  //设置添加点要素的属性信息
  var attValue = attr.map((item) => item.value)
  // 2.4 构建要素对象
  //创建一个要素
  var feature = new Zondy.Object.Feature({
    fGeom: fGeom,
    GraphicInfo: webGraphicInfo,
    AttValue: attValue,
  })
  //设置要素为点要素
  feature.setFType(1)
  // 2.5 设置要素集
  //创建一个要素数据集
  var featureSet = new Zondy.Object.FeatureSet()
  //设置属性结构
  var cAttStruct = new Zondy.Object.CAttStruct({
    FldName: attr.map((item) => item.name), // 属性的字段名
    FldNumber: attr.length, // 属性的个数
    FldType: attr.map((item) => item.type), // 属性的类型
  })
  featureSet.AttStruct = cAttStruct
  //添加要素到要素数据集
  featureSet.addFeature(feature)
  // 2.6 调用编辑服务接口
  //创建一个编辑服务类
  // 第一个参数: 服务的名称
  // 第二个参数: 图层的编号
  var editService = new Zondy.Service.EditDocFeature(info.name, info.layerID, {
    ip: HOST,
    port: PORT, //访问IGServer的端口号，.net版为6163，Java版为8089
  })
  //执行添加点要素功能
  if (callback) {
    editService.add(featureSet, callback)
  } else {
    editService.add(featureSet, onSuccess(info.doc))
  }
}

function onSuccess(docLayer) {
  return function (data) {
    if (data.succeed) {
      alert('添加成功!')
      docLayer.refresh() // 重新加载地图文档
    } else {
      alert('添加失败!')
    }
  }
}
